// pages/booking/select-time/index.js
const apiService = require('../../../utils/api.js');
const auth = require('../../../utils/auth.js');

Page({

	/**
	 * 页面的初始数据
	 */
	data: {
		statusBarHeight: 44, // 系统状态栏高度
		dateList: [], // 日期列表
		selectedDate: '', // 选中的日期
		timeSlots: [], // 时间段列表
		selectedTime: '', // 选中的时间
		currentWeekStart: null, // 当前周的开始日期
		// 预约相关数据
		serviceData: null, // 从select-service页面传来的服务数据
		roomData: null, // 从foster-care页面传来的房型数据
		storeId: '', // 门店ID
		petList: [], // 宠物列表
		selectedPets: [], // 选中的宠物
		isLoading: false, // 加载状态
		from: '' // 页面来源（如：pet-care-detail）
	},

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad(options) {
		// 获取系统信息
		this.getSystemInfo();
		
		// 处理页面参数
		this.processPageOptions(options);
		
		// 检查登录状态并加载数据
		this.checkLoginAndLoadData();
		
		// 初始化日期数据
		this.initDateData();
		
		// 设置默认选中今天
		this.selectTodayDate();
	},

	/**
	 * 处理页面参数
	 */
	processPageOptions(options) {
		// 处理从select-service页面传来的服务数据
		if (options.serviceData) {
			try {
				const serviceData = JSON.parse(decodeURIComponent(options.serviceData));
				this.setData({ serviceData });
				console.log('接收到服务数据：', serviceData);
			} catch (error) {
				console.error('解析服务数据失败：', error);
			}
		}
		
		// 处理门店ID
		if (options.storeId) {
			this.setData({ storeId: options.storeId });
		}
		
		// 处理来源标记
		if (options.from) {
			this.setData({ from: options.from });
		}
		
		// 处理从foster-care页面传来的房型数据
		if (options.roomId && options.startDate && options.endDate) {
			const roomData = {
				roomId: options.roomId,
				startDate: options.startDate,
				endDate: options.endDate
			};
			this.setData({ roomData });
			console.log('接收到房型数据：', roomData);
		}
	},

	/**
	 * 检查登录状态并加载数据
	 */
	async checkLoginAndLoadData() {
		if (!auth.checkLoginStatus()) {
			// 未登录，显示提示并跳转到登录页
			wx.showModal({
				title: '请先登录',
				content: '选择预约时间需要先登录账号',
				confirmText: '去登录',
				cancelText: '返回',
				success: (res) => {
					if (res.confirm) {
						auth.requireLogin('/pages/booking/select-time/index');
					} else {
						wx.navigateBack({
							delta: 1,
							fail: () => {
								wx.switchTab({
									url: '/pages/home/index/index'
								});
							}
						});
					}
				}
			});
			return;
		}
		
		// 已登录，加载宠物列表
		await this.loadPetList();
	},

	/**
	 * 加载宠物列表
	 */
	async loadPetList() {
		this.setData({ isLoading: true });

		try {
			const result = await apiService.getPetList();
			if (result.success) {
				this.setData({
					petList: result.data,
					isLoading: false
				});
			} else {
				throw new Error(result.message);
			}
		} catch (error) {
			console.error('加载宠物列表失败:', error);
			this.setData({ isLoading: false });
			wx.showToast({
				title: '加载宠物列表失败',
				icon: 'none'
			});
		}
	},

	/**
	 * 获取系统信息
	 */
	getSystemInfo() {
		const systemInfo = wx.getSystemInfoSync();
		this.setData({
			statusBarHeight: systemInfo.statusBarHeight || 44
		});
	},

	/**
	 * 初始化日期数据
	 */
	initDateData() {
		const today = new Date();
		const currentWeekStart = this.getWeekStart(today);
		this.setData({
			currentWeekStart: currentWeekStart
		});
		this.generateDateList(currentWeekStart);
	},

	/**
	 * 获取一周的开始日期（星期日）
	 */
	getWeekStart(date) {
		const d = new Date(date);
		const day = d.getDay();
		const diff = d.getDate() - day;
		return new Date(d.setDate(diff));
	},

	/**
	 * 生成日期列表
	 */
	generateDateList(weekStart) {
		const dateList = [];
		const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
		const today = new Date();
		today.setHours(0, 0, 0, 0);

		for (let i = 0; i < 7; i++) {
			const currentDate = new Date(weekStart);
			currentDate.setDate(weekStart.getDate() + i);
			
			// 判断是否为过去的日期（不可预约）
			const isPast = currentDate < today;
			
			dateList.push({
				date: this.formatDate(currentDate),
				day: currentDate.getDate(),
				weekday: weekdays[i],
				available: !isPast,
				dateObj: currentDate
			});
		}

		this.setData({
			dateList: dateList
		});
	},

	/**
	 * 格式化日期为YYYY-MM-DD格式
	 */
	formatDate(date) {
		const year = date.getFullYear();
		const month = String(date.getMonth() + 1).padStart(2, '0');
		const day = String(date.getDate()).padStart(2, '0');
		return `${year}-${month}-${day}`;
	},

	/**
	 * 设置默认选中今天
	 */
	selectTodayDate() {
		const today = new Date();
		const todayStr = this.formatDate(today);
		this.setData({
			selectedDate: todayStr
		});
		this.loadTimeSlots(todayStr);
	},

	/**
	 * 选择日期
	 */
	selectDate(e) {
		const { date } = e.currentTarget.dataset;
		const dateItem = this.data.dateList.find(item => item.date === date);
		
		// 如果是不可用的日期，不处理
		if (!dateItem || !dateItem.available) {
			return;
		}

		this.setData({
			selectedDate: date,
			selectedTime: '' // 清空之前选择的时间
		});

		// 加载对应日期的时间段
		this.loadTimeSlots(date);
	},

	/**
	 * 加载时间段数据
	 */
	loadTimeSlots(date) {
		// 基础时间段（半小时为单位），实际项目中应从服务器获取
		const baseTimes = [
			'09:00','09:30','10:00','10:30','11:00','11:30',
			'14:00','14:30','15:00','15:30','16:00','16:30'
		];

		// 判断所选日期是否为今天，用于置灰已经过了当前时间的时间段
		const todayStr = this.formatDate(new Date());
		const isToday = date === todayStr;
		let nowMinutes = 0;
		if (isToday) {
			const now = new Date();
			nowMinutes = now.getHours() * 60 + now.getMinutes();
		}

		const timeSlots = baseTimes.map(t => {
			const [h, m] = t.split(':').map(Number);
			const slotMinutes = h * 60 + m;
			// 期待逻辑：已过当前时间的选项置灰（不可预约），否则可选
			const status = (isToday && slotMinutes <= nowMinutes) ? 'unavailable' : 'available';
			return { time: t, price: 68, status };
		});

		this.setData({
			timeSlots: timeSlots
		});
	},

	/**
	 * 选择时间段
	 */
	selectTime(e) {
		const { time, status } = e.currentTarget.dataset;
		
		// 只有可预约和可等位的时间段可以选择
		if (status !== 'available' && status !== 'waiting') {
			return;
		}

		// 如果点击的是已选中的时间，则取消选择
		if (this.data.selectedTime === time) {
			this.setData({
				selectedTime: ''
			});
		} else {
			this.setData({
				selectedTime: time
			});
		}
	},

	/**
	 * 日期滑动事件
	 */
	onDateScroll(e) {
		// 可以在这里处理滑动加载更多日期的逻辑
		// 暂时保留接口，后续可扩展
	},

	/**
	 * 选择宠物
	 */
	selectPet(e) {
		const petId = e.currentTarget.dataset.petId;
		const { selectedPets } = this.data;
		
		let newSelectedPets = [...selectedPets];
		const index = newSelectedPets.indexOf(petId);
		
		if (index > -1) {
			// 已选择，取消选择
			newSelectedPets.splice(index, 1);
		} else {
			// 未选择，添加选择
			newSelectedPets.push(petId);
		}
		
		this.setData({
			selectedPets: newSelectedPets
		});
	},

	/**
	 * 确认选择
	 */
	async confirmSelection() {
		if (!this.data.selectedTime) {
			wx.showToast({
				title: '请选择时间段',
				icon: 'none'
			});
			return;
		}

		// 构建时间显示文本
		const timeText = `${this.data.selectedDate} ${this.data.selectedTime}`;
		
		// 将选中的时间保存到全局数据
		const app = getApp();
		app.globalData.selectedTime = timeText;
		
		console.log('保存选中时间到全局数据:', timeText);
		
		// 返回上一页（若来源为宠物美容详情，则返回两级）
		const delta = this.data.from === 'pet-care-detail' ? 2 : 1;
		wx.navigateBack({
			delta,
			success: () => {
				console.log(`返回上一页成功（delta=${delta}），已保存时间选择`);
			},
			fail: (error) => {
				console.error('返回上一页失败:', error);
			}
		});
	},

	/**
	 * 创建预约
	 */
	async createAppointment() {
		// 再次验证登录状态
		if (!auth.checkLoginStatus()) {
			wx.showModal({
				title: '登录已过期',
				content: '请重新登录后再试',
				confirmText: '去登录',
				success: (res) => {
					if (res.confirm) {
						auth.requireLogin('/pages/booking/select-time/index');
					}
				}
			});
			return;
		}

		try {
			wx.showLoading({ title: '创建预约中...' });

			// 构造预约时间戳
			const appointmentTime = this.getAppointmentTimestamp();
			
			// 构造预约数据
			const appointmentData = {
				storeId: this.data.storeId,
				serviceId: this.data.serviceData.selectedServices[0], // 取第一个服务
				petIds: this.data.selectedPets,
				appointmentTime: appointmentTime
			};

			const result = await apiService.createAppointment(appointmentData);
			
			if (result.success) {
				wx.hideLoading();
				wx.showToast({
					title: '预约创建成功',
					icon: 'success'
				});
				
				// 跳转到支付页面
				setTimeout(() => {
					wx.navigateTo({
						url: `/pages/pay/order-detail/index?appointmentId=${result.data._id}`
					});
				}, 1500);
			} else {
				// 处理API返回的错误信息
				const errorMessage = result.message || '创建预约失败';
				this.handleAppointmentError(errorMessage);
			}
		} catch (error) {
			wx.hideLoading();
			console.error('创建预约失败:', error);
			
			// 处理异常错误信息
			const errorMessage = error.message || '创建预约失败';
			this.handleAppointmentError(errorMessage);
		}
	},

	/**
	 * 处理预约错误信息，根据错误类型显示不同的提示
	 */
	handleAppointmentError(errorMessage) {
		if (errorMessage.includes('PET_CONFLICT:') || errorMessage.includes('该宠物已有预约')) {
			// 宠物已有预约
			const cleanMessage = errorMessage.replace('PET_CONFLICT:', '').trim();
			wx.showToast({
				title: cleanMessage || '该宠物已有预约，请选择其他时段',
				icon: 'none',
				duration: 3000
			});
		} else if (errorMessage.includes('ROOM_FULL:') || errorMessage.includes('该房间已被约满') || errorMessage.includes('该时间段该服务已满') || errorMessage.includes('请选择其他时间或房型')) {
			// 房间已被约满
			const cleanMessage = errorMessage.replace('ROOM_FULL:', '').trim();
			wx.showToast({
				title: cleanMessage || '该房间已被约满，请选择其他房型',
				icon: 'none',
				duration: 3000
			});
		} else {
			wx.showToast({
				title: errorMessage,
				icon: 'none'
			});
		}
	},

	/**
	 * 获取预约时间戳
	 */
	getAppointmentTimestamp() {
		const { selectedDate, selectedTime } = this.data;
		const dateTime = `${selectedDate} ${selectedTime}`;
		return Math.floor(new Date(dateTime).getTime() / 1000);
	},

	/**
	 * 返回上一页
	 */
	onBack() {
		wx.navigateBack({
			delta: 1,
			success: () => {
				console.log('返回上一页成功');
			},
			fail: (error) => {
				console.error('返回上一页失败:', error);
				// 降级处理：跳转到首页
				wx.switchTab({
					url: '/pages/home/index/index'
				});
			}
		});
	},

	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady() {

	},

	/**
	 * 生命周期函数--监听页面显示
	 */
	async onShow() {
		// 验证登录状态
		const isLoggedIn = await auth.validateLoginStatus();
		if (isLoggedIn) {
			// 刷新宠物列表
			await this.loadPetList();
		} else {
			// 登录状态失效，重新检查
			this.checkLoginAndLoadData();
		}
	},

	/**
	 * 生命周期函数--监听页面隐藏
	 */
	onHide() {

	},

	/**
	 * 生命周期函数--监听页面卸载
	 */
	onUnload() {

	},

	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh() {

	},

	/**
	 * 页面上拉触底事件的处理函数
	 */
	onReachBottom() {

	},

	/**
	 * 用户点击右上角分享
	 */
	onShareAppMessage() {

	}
})